perm filename DVX.PSC[MF,ALS] blob
sn#800342 filedate 1985-09-05 generic text, type T, neo UTF8
{3:}{$D+,W+}PROGRAM DVIIMP;LABEL{4:}9999;{:4}CONST{5:}MAXFONTS=50;
MAXGLYPHS=7680;LINELENGTH=320;TERMINALLINE=150;STACKSIZE=100;
NAMESIZE=1000;NAMELENGTH=50;M1MAX=3;M2SIZE=86000;M2MAX=85999;
MMSIZE=344000;MMMAX=343999;MAXCHARNO=255;{:5}{163:}FNAMESIZE=24;{:163}
TYPE{8:}ASCIICODE=32..126;{:8}{9:}TEXTFILE=PACKED FILE OF CHAR;{:9}{23:}
EIGHTBITS=0..255;BYTEFILE=PACKED FILE OF EIGHTBITS;{:23}{164:}
FILENAME=PACKED ARRAY[1..FNAMESIZE]OF CHAR;{:164}VAR{10:}
XORD:ARRAY[CHAR]OF ASCIICODE;XCHR:ARRAY[0..255]OF CHAR;{:10}{24:}
DVIFILE:BYTEFILE;GFFILE:BYTEFILE;TFMFILE:BYTEFILE;IMFILE:BYTEFILE;{:24}
{25:}STARTPAGE:INTEGER;NUMPAGES:INTEGER;FCOUNT,LCOUNT:INTEGER;
FFLAG,NFLAG:BOOLEAN;PAGEMATCH:BOOLEAN;COUNTER:INTEGER;COPIES:INTEGER;
{:25}{30:}CURLOC:INTEGER;CURGFLOC:INTEGER;
CURNAME:PACKED ARRAY[1..NAMELENGTH]OF CHAR;
CURTFMNAME:PACKED ARRAY[1..NAMELENGTH]OF CHAR;IMBYTENO:INTEGER;{:30}
{32:}B0,B1,B2,B3:EIGHTBITS;{:32}{46:}
FONTNUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTMVAL:ARRAY[0..MAXFONTS]OF INTEGER;
FONTNAME:ARRAY[0..MAXFONTS]OF 0..NAMESIZE;
NAMES:ARRAY[0..NAMESIZE]OF ASCIICODE;
FONTCHECKSUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSCALEDSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTDESIGNSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSPACE:ARRAY[0..MAXFONTS]OF INTEGER;
FONTBC:ARRAY[0..MAXFONTS]OF INTEGER;FONTEC:ARRAY[0..MAXFONTS]OF INTEGER;
DATABASE:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTH:ARRAY[0..MAXGLYPHS]OF INTEGER;INWIDTH:ARRAY[0..255]OF INTEGER;
TFMCHECKSUM:INTEGER;NF:0..MAXFONTS;NF2:0..95;
IMEXTENSION:ARRAY[0..MAXFONTS]OF INTEGER;WIDTHPTR:0..MAXGLYPHS;
BC,EC:INTEGER;WBYTE:ARRAY[0..MAXCHARNO,0..3]OF EIGHTBITS;
GFPTR:ARRAY[0..MAXCHARNO]OF INTEGER;{:46}{50:}GFCHECKSUM:INTEGER;{:50}
{56:}DESIGNSIZE:INTEGER;HPPP,VPPP:INTEGER;CHECKSUM:INTEGER;
GFPOSTLOC:INTEGER;MAGNIFICATIO:REAL;DX:ARRAY[0..MAXCHARNO]OF INTEGER;
DY:INTEGER;TOTALGLYPHS:INTEGER;
MMSTORE:PACKED ARRAY[0..M1MAX,4..M2MAX]OF EIGHTBITS;MM,M1,M2:INTEGER;
FREELIMIT:INTEGER;DATASTART:ARRAY[0..MAXFONTS]OF INTEGER;
FONTORDER:ARRAY[0..MAXFONTS]OF INTEGER;GFPREVPTR:INTEGER;
CHARCODE:INTEGER;GLYPHPTR:ARRAY[0..MAXGLYPHS]OF INTEGER;
MAXM,MINM,MAXN,MINN:INTEGER;ROWCOUNT:INTEGER;COLUMNCOUNT:INTEGER;
MAXCOLUMNCOU:INTEGER;{:56}{62:}PIXELWIDTH:ARRAY[0..MAXGLYPHS]OF INTEGER;
CONV:REAL;TRUECONV:REAL;NUMERATOR,DENOMINATOR:INTEGER;MAG:INTEGER;
EMPTYGLYPH:BOOLEAN;{:62}{78:}MAXPAGES:INTEGER;RESOLUTION:REAL;
NEWMAG:INTEGER;{:78}{79:}STARTCOUNT:ARRAY[0..9]OF INTEGER;
STARTTHERE:ARRAY[0..9]OF BOOLEAN;STARTVALS:0..9;
COUNT:ARRAY[0..9]OF INTEGER;{:79}{82:}
BUFFER:ARRAY[0..TERMINALLINE]OF ASCIICODE;{:82}{85:}
BUFPTR:0..TERMINALLINE;{:85}{93:}FONTSTATE:ARRAY[0..MAXFONTS]OF INTEGER;
FONTAVAL:ARRAY[0..MAXFONTS]OF INTEGER;
FONTLVAL:ARRAY[0..MAXFONTS]OF INTEGER;SCALEVAL:ARRAY[0..12]OF INTEGER;
{:93}{101:}DEFAULTDIREC:PACKED ARRAY[1..8]OF CHAR;
DFLTTFMDIREC:PACKED ARRAY[1..9]OF CHAR;{:101}{112:}
ATAB:ARRAY[1..8]OF INTEGER;BTAB:ARRAY[0..8]OF INTEGER;{:112}{122:}
H,V,W,X,Y,Z,HH,HHI,VV,VVI:INTEGER;
HSTACK,VSTACK,WSTACK,XSTACK,YSTACK,ZSTACK:ARRAY[0..STACKSIZE]OF INTEGER;
HHSTACK,VVSTACK:ARRAY[0..STACKSIZE]OF INTEGER;HORG,VORG:INTEGER;{:122}
{123:}MAXV:INTEGER;MAXH:INTEGER;MAXS:INTEGER;MAXSSOFAR:INTEGER;
TOTALPAGES:INTEGER;{:123}{127:}PENSIZE:INTEGER;
HHPOINT,VVPOINT:ARRAY[0..255]OF INTEGER;PINDEX:INTEGER;
JOINPOINTS:ARRAY[0..255]OF EIGHTBITS;VERTEXCOUNT:INTEGER;
XXXPOINT:ARRAY[1..6]OF EIGHTBITS;XXXJOIN:ARRAY[1..5]OF EIGHTBITS;
XXXRECTANGLE:ARRAY[1..10]OF EIGHTBITS;XXXCIRCLE:ARRAY[1..7]OF EIGHTBITS;
XXXARC:ARRAY[1..4]OF EIGHTBITS;XXXSEGM:ARRAY[1..5]OF EIGHTBITS;
XXXELLIPSE:ARRAY[1..8]OF EIGHTBITS;XXXO:EIGHTBITS;XXXK:INTEGER;{:127}
{135:}S:INTEGER;CURFONT:INTEGER;{:135}{154:}POSTLOC:INTEGER;
FIRSTBACKPOI:INTEGER;NEWBACKPOINT:INTEGER;{:154}{160:}K,M,N,P,Q:INTEGER;
IDLEN:0..255;ID:PACKED ARRAY[0..255]OF 0..255;{:160}{165:}
IMPNAME,DVINAME:FILENAME;DVINLEN:1..FNAMESIZE;
PPN:RECORD CASE INTEGER OF 1:(INT:INTEGER);
2:(SIXBIT:PACKED ARRAY[1..6]OF 0..63)END;SUCCESS:BOOLEAN;
SPOOLIT:BOOLEAN;{:165}PROCEDURE INITIALIZE;VAR I:INTEGER;JJ:REAL;
BEGIN WRITELN(TTY,'This is DVIIMP, Version 0.92');{11:}
FOR I:=0 TO 31 DO XCHR[I]:='?';XCHR[32]:=' ';XCHR[33]:='!';
XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';
XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';
XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';
XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';
XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';
XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';
XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';
XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';
XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';
XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';
XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';
XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';
XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';
XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';XCHR[102]:='f';
XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';XCHR[106]:='j';
XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';XCHR[110]:='n';
XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';XCHR[114]:='r';
XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';XCHR[118]:='v';
XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';XCHR[122]:='z';
XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';XCHR[126]:='~';
FOR I:=127 TO 255 DO XCHR[I]:='?';{:11}{12:}
FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;
FOR I:=32 TO 126 DO XORD[XCHR[I]]:=I;{:12}{26:}COUNTER:=0;
FCOUNT:=MAXPAGES;LCOUNT:=0;NUMPAGES:=MAXPAGES;COPIES:=1;FFLAG:=FALSE;
NFLAG:=FALSE;RESOLUTION:=300.0;HORG:=ROUND(RESOLUTION);
VORG:=ROUND(RESOLUTION);{:26}{47:}NF:=0;WIDTHPTR:=0;FONTNAME[0]:=0;
FONTSPACE[0]:=0;NF2:=95;FOR I:=0 TO MAXFONTS DO IMEXTENSION[I]:=-1;{:47}
{57:}FOR I:=0 TO MAXGLYPHS DO GLYPHPTR[I]:=-1;TOTALGLYPHS:=0;MM:=4;
M1:=0;M2:=4;FREELIMIT:=MMMAX;FOR I:=0 TO MAXFONTS DO FONTORDER[I]:=-1;
{:57}{80:}MAXPAGES:=1000;STARTVALS:=0;STARTTHERE[0]:=FALSE;NEWMAG:=0;
{:80}{94:}SCALEVAL[0]:=ROUND(1.0954*RESOLUTION);JJ:=1.0;
FOR I:=1 TO 7 DO BEGIN JJ:=1.2*JJ;SCALEVAL[I]:=ROUND(JJ*RESOLUTION);
{WRITELN(TTY,' i=',I:1,' jj=',JJ:1,' scale val=',SCALEVAL[I]:1);}END;
SCALEVAL[8]:=4*ROUND(RESOLUTION);SCALEVAL[9]:=5*ROUND(RESOLUTION);
SCALEVAL[10]:=6*ROUND(RESOLUTION);SCALEVAL[11]:=7*ROUND(RESOLUTION);
SCALEVAL[12]:=8*ROUND(RESOLUTION);{:94}{102:}DEFAULTDIREC:='[GF,SYS]';
DFLTTFMDIREC:='[TEX,SYS]';{:102}{113:}ATAB[1]:=128;BTAB[0]:=255;
FOR I:=2 TO 8 DO ATAB[I]:=ATAB[I-1]DIV 2;
FOR I:=1 TO 8 DO BTAB[I]:=BTAB[I-1]DIV 2;{:113}{124:}MAXS:=STACKSIZE+1;
MAXSSOFAR:=0;{:124}{128:}XXXPOINT[1]:=112;XXXPOINT[2]:=111;
XXXPOINT[3]:=105;XXXPOINT[4]:=110;XXXPOINT[5]:=116;XXXPOINT[6]:=32;
XXXJOIN[1]:=106;XXXJOIN[2]:=111;XXXJOIN[3]:=105;XXXJOIN[4]:=110;
XXXJOIN[5]:=32;XXXRECTANGLE[1]:=114;XXXRECTANGLE[2]:=101;
XXXRECTANGLE[3]:=99;XXXRECTANGLE[4]:=116;XXXRECTANGLE[5]:=97;
XXXRECTANGLE[6]:=110;XXXRECTANGLE[7]:=103;XXXRECTANGLE[8]:=108;
XXXRECTANGLE[9]:=101;XXXRECTANGLE[10]:=32;XXXCIRCLE[1]:=99;
XXXCIRCLE[2]:=105;XXXCIRCLE[3]:=114;XXXCIRCLE[4]:=99;XXXCIRCLE[5]:=108;
XXXCIRCLE[6]:=101;XXXCIRCLE[7]:=32;XXXARC[1]:=97;XXXARC[2]:=114;
XXXARC[3]:=99;XXXARC[4]:=32;XXXSEGM[1]:=115;XXXSEGM[2]:=101;
XXXSEGM[3]:=103;XXXSEGM[4]:=109;XXXSEGM[5]:=32;XXXELLIPSE[1]:=101;
XXXELLIPSE[2]:=108;XXXELLIPSE[3]:=108;XXXELLIPSE[4]:=105;
XXXELLIPSE[5]:=112;XXXELLIPSE[6]:=115;XXXELLIPSE[7]:=101;
XXXELLIPSE[8]:=32;{:128}END;{:3}{7:}PROCEDURE JUMPOUT;BEGIN GOTO 9999;
END;{:7}{27:}FUNCTION READINT:INTEGER;VAR I:INTEGER;NEGFLAG:BOOLEAN;
BEGIN NEGFLAG:=FALSE;I:=0;GET(TTY);WHILE TTY↑=' 'DO GET(TTY);
IF(TTY↑='-')THEN NEGFLAG:=TRUE;WHILE(TTY↑='-')OR(TTY↑='+')DO GET(TTY);
WHILE(TTY↑>='0')AND(TTY↑<='9')DO BEGIN I:=I*10+XORD[TTY↑]-48;GET(TTY);
END;IF NEGFLAG THEN I:=-I;READINT:=I;END;PROCEDURE READF;
BEGIN STARTPAGE:=READINT;FFLAG:=TRUE;END;PROCEDURE READN;
BEGIN NUMPAGES:=READINT;IF NUMPAGES=0 THEN NUMPAGES:=MAXPAGES;
NFLAG:=TRUE;END;PROCEDURE READC;BEGIN COPIES:=READINT;END;
PROCEDURE READH;BEGIN HORG:=READINT;END;PROCEDURE READV;
BEGIN VORG:=READINT;END;{:27}{28:}
PROCEDURE ESP(VAR DVIFILE,IMFILE:FILE);EXTERN;FUNCTION RESCAN:BOOLEAN;
EXTERN;PROCEDURE CURNAM(VAR CHAN:FILE;VAR S:STRING);EXTERN;
FUNCTION ERSTAT(VAR F:FILE):INTEGER;EXTERN;PROCEDURE OPENDVIFILE;
LABEL 223;VAR I:INTEGER;SEENDOT,SEENLEFTBRAC,SEENRIGHTBRA:BOOLEAN;
SEENSLASH:BOOLEAN;BEGIN IF RESCAN THEN BEGIN READLN(TTY);
WHILE(NOT EOLN(TTY))AND(TTY↑<>';')DO GET(TTY);END;
IF EOLN(TTY)THEN WRITE(TTY,'DVI file? ');223:I:=1;GET(TTY);
SEENDOT:=FALSE;SEENLEFTBRAC:=FALSE;SEENRIGHTBRA:=FALSE;SEENSLASH:=FALSE;
WHILE(NOT EOLN(TTY))AND(NOT SEENSLASH)DO BEGIN IF TTY↑='.'THEN SEENDOT:=
TRUE ELSE IF TTY↑=']'THEN SEENRIGHTBRA:=TRUE ELSE IF TTY↑='['THEN BEGIN
IF NOT SEENDOT THEN BEGIN SEENDOT:=TRUE;DVINAME[I]:='.';I:=I+1;
DVINAME[I]:='D';I:=I+1;DVINAME[I]:='V';I:=I+1;DVINAME[I]:='I';I:=I+1;
END;SEENLEFTBRAC:=TRUE END;
IF TTY↑='/'THEN SEENSLASH:=TRUE ELSE BEGIN DVINAME[I]:=TTY↑;I:=I+1;
GET(TTY);END;END;IF NOT SEENDOT THEN BEGIN DVINAME[I]:='.';I:=I+1;
DVINAME[I]:='D';I:=I+1;DVINAME[I]:='V';I:=I+1;DVINAME[I]:='I';I:=I+1;
END;IF SEENLEFTBRAC AND NOT SEENRIGHTBRA THEN BEGIN DVINAME[I]:=']';
I:=I+1;END;SPOOLIT:=TRUE;
WHILE(SEENSLASH)AND(NOT EOLN(TTY))DO BEGIN GET(TTY);
IF(TTY↑='c')OR(TTY↑='C')THEN READC ELSE IF(TTY↑='f')OR(TTY↑='F')THEN
READF ELSE IF(TTY↑='n')OR(TTY↑='N')THEN READN ELSE IF(TTY↑='h')OR(TTY↑=
'H')THEN READH ELSE IF(TTY↑='v')OR(TTY↑='V')THEN READV ELSE IF(TTY↑='i')
OR(TTY↑='I')THEN BEGIN SPOOLIT:=FALSE;GET(TTY);END;
IF TTY↑='/'THEN SEENSLASH:=TRUE ELSE SEENSLASH:=FALSE;END;
RESET(DVIFILE,DVINAME,'/B:8/N:9/O');
IF(ERSTAT(DVIFILE)MOD 8192)>0 THEN BEGIN WRITE(TTY,'.DVI file? ');
GOTO 223;END;CURLOC:=0;END;PROCEDURE OPENGFFILE;
BEGIN RESET(GFFILE,CURNAME,'/B:8/O/N:9');CURGFLOC:=0;END;
PROCEDURE OPENTFMFILE;BEGIN RESET(TFMFILE,CURTFMNAME,'/B:8/O/N:9');
CURGFLOC:=0;END;{:28}{29:}PROCEDURE OPENIMFILE;LABEL 30;VAR I,J:INTEGER;
BEGIN CURNAM(DVIFILE,IMPNAME);I:=1;
WHILE(IMPNAME[I]>'.')AND(IMPNAME[I]<>'[')DO I:=I+1;
IF SPOOLIT THEN BEGIN J:=I-1;IMPNAME[I]:='.';I:=I+1;IMPNAME[I]:='L';
I:=I+1;IMPNAME[I]:='P';I:=I+1;IMPNAME[I]:='T';I:=I+1;IMPNAME[I]:='[';
I:=I+1;IMPNAME[I]:='S';I:=I+1;IMPNAME[I]:='P';I:=I+1;IMPNAME[I]:='L';
I:=I+1;IMPNAME[I]:=',';I:=I+1;IMPNAME[I]:='S';I:=I+1;IMPNAME[I]:='Y';
I:=I+1;IMPNAME[I]:='S';I:=I+1;IMPNAME[I]:=']';I:=I+1;
WHILE I<FNAMESIZE DO BEGIN IMPNAME[I]:=' ';I:=I+1;END;
WHILE TRUE DO BEGIN RESET(IMFILE,IMPNAME,'/O');
IF(ERSTAT(IMFILE)MOD 8192)>0 THEN GOTO 30;
IMPNAME[J]:=CHR(ORD(IMPNAME[J])+1);
IF IMPNAME[J]>'Z'THEN BEGIN IMPNAME[J-1]:=CHR(ORD(IMPNAME[J-1])+1);
IMPNAME[J]:='A';IF IMPNAME[J-1]>'Z'THEN IMPNAME[J-1]:='A';END;END;
30:END ELSE BEGIN IMPNAME[I]:='.';I:=I+1;IMPNAME[I]:='I';I:=I+1;
IMPNAME[I]:='M';I:=I+1;IMPNAME[I]:='P';I:=I+1;
WHILE I<FNAMESIZE DO BEGIN IMPNAME[I]:=' ';I:=I+1;END;END;
REWRITE(IMFILE,IMPNAME,'/B:8/N:9/P:256');IMBYTENO:=0;END;{:29}{31:}
FUNCTION GFBYTE:INTEGER;VAR B:EIGHTBITS;
BEGIN IF EOF(GFFILE)THEN GFBYTE:=0 ELSE BEGIN READ(GFFILE,B);
CURGFLOC:=CURGFLOC+1;GFBYTE:=B;END;END;FUNCTION GFTWOBYTES:INTEGER;
VAR A,B:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
CURGFLOC:=CURGFLOC+2;GFTWOBYTES:=A*256+B;END;
FUNCTION GFTHREEBYTES:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(GFFILE,A);
READ(GFFILE,B);READ(GFFILE,C);CURGFLOC:=CURGFLOC+3;
GFTHREEBYTES:=(A*256+B)*256+C;END;FUNCTION GFSIGNEDQUAD:INTEGER;
VAR A,B,C,D:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
READ(GFFILE,C);READ(GFFILE,D);CURGFLOC:=CURGFLOC+4;
IF A<128 THEN GFSIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE GFSIGNEDQUAD:=(
((A-256)*256+B)*256+C)*256+D;END;{:31}{33:}PROCEDURE READTFMWORD;
BEGIN READ(TFMFILE,B0);READ(TFMFILE,B1);READ(TFMFILE,B2);
READ(TFMFILE,B3);END;{:33}{34:}FUNCTION GETBYTE:INTEGER;VAR B:EIGHTBITS;
BEGIN IF EOF(DVIFILE)THEN GETBYTE:=0 ELSE BEGIN READ(DVIFILE,B);
CURLOC:=CURLOC+1;GETBYTE:=B;END;END;FUNCTION SIGNEDBYTE:INTEGER;
VAR B:EIGHTBITS;BEGIN READ(DVIFILE,B);CURLOC:=CURLOC+1;
IF B<128 THEN SIGNEDBYTE:=B ELSE SIGNEDBYTE:=B-256;END;
FUNCTION GETTWOBYTES:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;GETTWOBYTES:=A*256+B;END;
FUNCTION SIGNEDPAIR:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;
IF A<128 THEN SIGNEDPAIR:=A*256+B ELSE SIGNEDPAIR:=(A-256)*256+B;END;
FUNCTION GETTHREEBYTE:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);READ(DVIFILE,C);CURLOC:=CURLOC+3;
GETTHREEBYTE:=(A*256+B)*256+C;END;FUNCTION SIGNEDTRIO:INTEGER;
VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);READ(DVIFILE,B);
READ(DVIFILE,C);CURLOC:=CURLOC+3;
IF A<128 THEN SIGNEDTRIO:=(A*256+B)*256+C ELSE SIGNEDTRIO:=((A-256)*256+
B)*256+C;END;FUNCTION SIGNEDQUAD:INTEGER;VAR A,B,C,D:EIGHTBITS;
BEGIN READ(DVIFILE,A);READ(DVIFILE,B);READ(DVIFILE,C);READ(DVIFILE,D);
CURLOC:=CURLOC+4;
IF A<128 THEN SIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE SIGNEDQUAD:=(((A
-256)*256+B)*256+C)*256+D;END;{:34}{35:}FUNCTION DVILENGTH:INTEGER;
BEGIN SETPOS(DVIFILE,-1);DVILENGTH:=CURPOS(DVIFILE);END;
PROCEDURE MOVETOBYTE(N:INTEGER);BEGIN SETPOS(DVIFILE,N);CURLOC:=N;END;
{:35}{36:}FUNCTION GFLENGTH:INTEGER;BEGIN SETPOS(GFFILE,-1);
GFLENGTH:=CURPOS(GFFILE);END;PROCEDURE MOVETOGFBYTE(N:INTEGER);
BEGIN SETPOS(GFFILE,N);CURGFLOC:=N;END;{:36}{37:}
PROCEDURE IMSBYTE(W:INTEGER);BEGIN IF W<0 THEN W:=W+256;
BEGIN WRITE(IMFILE,W);IMBYTENO:=IMBYTENO+1;END;END;
PROCEDURE IMHALFWORD(W:INTEGER);BEGIN IF W<0 THEN W:=W+65536;
BEGIN WRITE(IMFILE,W DIV 256);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,W MOD 256);IMBYTENO:=IMBYTENO+1;END;END;{:37}{45:}
PROCEDURE MAKESPACE;VAR I,J,K,Q:INTEGER;
BEGIN{WRITE(TTY,' overwriting font ');WRITELN(TTY,FONTORDER[0]:1,' ');}
J:=DATASTART[FONTORDER[0]];K:=DATASTART[FONTORDER[1]];Q:=GLYPHPTR[K];
IF Q>12 THEN FREELIMIT:=Q-1 ELSE FREELIMIT:=MMSIZE;
FOR I:=J TO K-1 DO IF GLYPHPTR[I]>=4 THEN GLYPHPTR[I]:=0;
FOR I:=0 TO MAXFONTS-1 DO FONTORDER[I]:=FONTORDER[I+1];END;{:45}{48:}
PROCEDURE PRINTFONT(F:INTEGER);VAR K:0..NAMESIZE;
BEGIN IF F=NF THEN WRITE(TTY,'UNDEFINED!')ELSE BEGIN FOR K:=FONTNAME[F]
TO FONTNAME[F+1]-1 DO WRITE(TTY,XCHR[NAMES[K]]);END;END;{:48}{49:}
PROCEDURE PRINTEXTENSI(M:INTEGER);BEGIN WRITE(TTY,'.');
WRITE(TTY,XCHR[(M DIV 100)+48]);WRITE(TTY,XCHR[(M MOD 100)DIV 10+48]);
WRITE(TTY,XCHR[M MOD 10+48]);END;{:49}{51:}
FUNCTION FINDGFPOSTAM:BOOLEAN;VAR Q,K:INTEGER;BEGIN FINDGFPOSTAM:=TRUE;
GFPOSTLOC:=GFLENGTH-4;REPEAT IF GFPOSTLOC=0 THEN FINDGFPOSTAM:=FALSE;
MOVETOGFBYTE(GFPOSTLOC);K:=GFBYTE;GFPOSTLOC:=GFPOSTLOC-1;UNTIL K<>223;
IF K<>131 THEN FINDGFPOSTAM:=FALSE;MOVETOGFBYTE(GFPOSTLOC-3);
Q:=GFSIGNEDQUAD;IF(Q<0)OR(Q>GFPOSTLOC-3)THEN FINDGFPOSTAM:=FALSE;
MOVETOGFBYTE(Q);K:=GFBYTE;IF K<>248 THEN FINDGFPOSTAM:=FALSE;
{WRITELN(TTY,' gf postamble at ',CURGFLOC:1);}END;{:51}{52:}
PROCEDURE READGFPOSTAM;VAR K,L:INTEGER;P,Q,M,C:INTEGER;
BEGIN GFPOSTLOC:=CURGFLOC-1;P:=GFSIGNEDQUAD;DESIGNSIZE:=GFSIGNEDQUAD;
CHECKSUM:=GFSIGNEDQUAD;HPPP:=GFSIGNEDQUAD;VPPP:=GFSIGNEDQUAD;
MAGNIFICATIO:=HPPP/(65536.0*RESOLUTION/72.27);{53:}
IF DESIGNSIZE<>FONTDESIGNSI[CURFONT]*16 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'design sizes for font ');PRINTFONT(CURFONT);
PRINTEXTENSI(FONTMVAL[CURFONT]);WRITE(TTY,' do not agree. ');END;
IF(CHECKSUM<>FONTCHECKSUM[CURFONT])AND(CHECKSUM<>0)AND(FONTCHECKSUM[
CURFONT]<>0)THEN BEGIN WRITELN(TTY);WRITE(TTY,'check sums for font ');
PRINTFONT(CURFONT);PRINTEXTENSI(FONTMVAL[CURFONT]);
WRITE(TTY,' do not agree. ');END;
Q:=ROUND((RESOLUTION*65536/72.27)*(MAG/1000.0)*FONTSCALEDSI[CURFONT]/
FONTDESIGNSI[CURFONT]);
IF((Q-(Q DIV 100))>HPPP)OR((Q+(Q DIV 100))<HPPP)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'at size values for font ');PRINTFONT(CURFONT);
PRINTEXTENSI(FONTMVAL[CURFONT]);
WRITE(TTY,' disagree by more than one percent. ');END;{:53};
MINM:=GFSIGNEDQUAD;MAXM:=GFSIGNEDQUAD;MINN:=GFSIGNEDQUAD;
MAXN:=GFSIGNEDQUAD;BC:=MAXCHARNO;EC:=0;{54:}
FOR K:=0 TO MAXCHARNO DO BEGIN FOR L:=0 TO 3 DO WBYTE[K,L]:=0;
GFPTR[K]:=0;END;{:54};{55:}REPEAT K:=GFBYTE;
IF(K=245)OR(K=246)THEN BEGIN C:=GFBYTE;
IF C>MAXCHARNO THEN BEGIN WRITE(TTY,' ','Character number too large');
JUMPOUT;END;IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
IF K=245 THEN BEGIN DX[C]:=GFSIGNEDQUAD DIV 65536;DY:=GFSIGNEDQUAD;
END ELSE BEGIN DX[C]:=GFBYTE;DY:=0;END;
{WRITE(TTY,' k=',K:1,' c=',C:1,' dx=',DX[C]:1);}WBYTE[C,0]:=GFBYTE;
WBYTE[C,1]:=GFBYTE;WBYTE[C,2]:=GFBYTE;WBYTE[C,3]:=GFBYTE;
GFPTR[C]:=GFSIGNEDQUAD;{WRITELN(TTY,' k=',K:1,' gfptr=',GFPTR[C]:1);}
K:=244;END;UNTIL K<>244;{:55};WHILE NOT EOF(GFFILE)DO M:=GFBYTE;END;
FUNCTION FIRSTGFPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63:FIRSTGFPAR:=O-0;
64,71,245,246,239:FIRSTGFPAR:=GFBYTE;65,72,240:FIRSTGFPAR:=GFTWOBYTES;
66,73,241:FIRSTGFPAR:=GFTHREEBYTES;242,243:FIRSTGFPAR:=GFSIGNEDQUAD;
67,68,69,70,244,247,248,249,250,251,252,253,254,255:FIRSTGFPAR:=0;
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,
116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238:FIRSTGFPAR:=
O-74;END;END;PROCEDURE COPYBYTE;VAR W:EIGHTBITS;BEGIN W:=GFBYTE;
BEGIN MMSTORE[M1,M2]:=W;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;END;
PROCEDURE STOWPAIR(W:INTEGER);BEGIN BEGIN MMSTORE[M1,M2]:=W DIV 256;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
BEGIN MMSTORE[M1,M2]:=W MOD 256;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;END;
PROCEDURE STOWSIGNEDPA(W:INTEGER);BEGIN IF W<0 THEN W:=W+65536;
BEGIN MMSTORE[M1,M2]:=W DIV 256;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
BEGIN MMSTORE[M1,M2]:=W MOD 256;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;END;{:52}
{58:}{PROCEDURE TABULATE;VAR I,J,K,L:INTEGER;BEGIN WRITELN(TTY);
WRITELN(TTY,' Contents of the glyph ptr table');WRITE(TTY,' ');
FOR J:=0 TO 9 DO WRITE(TTY,J:7);WRITELN(TTY);
FOR I:=0 TO 29 DO BEGIN WRITE(TTY,I*10:3,' ');
FOR J:=0 TO 9 DO BEGIN K:=GLYPHPTR[10*I+J];L:=K DIV M2SIZE;
K:=K MOD M2SIZE;WRITE(TTY,L:1,',',K:1);END;WRITELN(TTY);END;END;}{:58}
{59:}FUNCTION INGF(Z:INTEGER):BOOLEAN;LABEL 30,40,9997,9998,9999;
VAR K:INTEGER;NW:INTEGER;WP:0..MAXGLYPHS;ALPHA,BETA:INTEGER;C:INTEGER;
O:INTEGER;P:INTEGER;DELM:INTEGER;DELN:INTEGER;
MMSAVE,M1SAVE,M2SAVE:INTEGER;
BEGIN IF NOT FINDGFPOSTAM THEN BEGIN WRITELN(TTY,
' Trouble with postamble');GOTO 9997;END;READGFPOSTAM;{60:}
FONTBC[CURFONT]:=BC;FONTEC[CURFONT]:=EC;
IF FONTEC[CURFONT]<FONTBC[CURFONT]THEN FONTBC[CURFONT]:=FONTEC[CURFONT]
+1;IF WIDTHPTR+FONTEC[CURFONT]-FONTBC[CURFONT]+1>MAXGLYPHS THEN BEGIN
WRITELN(TTY,'---not loaded, DVIIMP needs larger width table');GOTO 9998;
END;WP:=WIDTHPTR+FONTEC[CURFONT]-FONTBC[CURFONT]+1;NW:=EC+1-BC;
{WRITELN(TTY,' bc=',BC:1,' ec=',EC:1,' nw=',NW:1);}
IF(NW=0)OR(NW>256)THEN GOTO 9997;{:60};{63:}{64:}BEGIN ALPHA:=16*Z;
BETA:=16;WHILE Z>=8388608 DO BEGIN Z:=Z DIV 2;BETA:=BETA DIV 2;END;
END{:64};DATABASE[CURFONT]:=WIDTHPTR-BC;DATASTART[CURFONT]:=WIDTHPTR;
WP:=WIDTHPTR+EC-BC+1;C:=BC;
FOR K:=WIDTHPTR TO WP-1 DO BEGIN IF GFPTR[C]=0 THEN BEGIN WIDTH[K]:=
2147483647;PIXELWIDTH[K]:=0;{WRITE(TTY,' invalid width for c=',C:1);}
END ELSE BEGIN WIDTH[K]:=(((((WBYTE[C,3]*Z)DIV 256)+(WBYTE[C,2]*Z))DIV
256)+(WBYTE[C,1]*Z))DIV BETA;
IF(WBYTE[C,0]>0)THEN IF(WBYTE[C,0]<255)THEN BEGIN WRITELN(TTY,' w byte='
,WBYTE[C,0]:1);GOTO 9997 END ELSE WIDTH[K]:=WIDTH[K]-ALPHA;
PIXELWIDTH[K]:=DX[C];END;{WRITE(TTY,' dx=',DX[C]:1,' for ',C:1);
WRITE(TTY,' [ ',C:1,']');}C:=C+1;END;{:63};{61:}OPENGFFILE;O:=GFBYTE;
IF O<>247 THEN BEGIN WRITELN(TTY,' GF file does not start with |pre|');
GOTO 9997;END;O:=GFBYTE;
IF O<>131 THEN BEGIN WRITELN(TTY,' id =',O:1,' should be ',131:1);
GOTO 9997;END;O:=GFBYTE;WHILE O>0 DO BEGIN O:=O-1;P:=GFBYTE;END;{:61};
{70:}{WRITELN(TTY,' loading font ',CURFONT:1,'[',M1:1,',',M2:1,'] ');
WRITE(TTY,(FREELIMIT DIV M2SIZE):1,'-',(FREELIMIT MOD M2SIZE):1,' ');}
K:=0;WHILE FONTORDER[K]>=0 DO K:=K+1;FONTORDER[K]:=CURFONT;
REPEAT GFPREVPTR:=CURGFLOC;{76:}REPEAT O:=GFBYTE;
IF(O=243)THEN BEGIN P:=FIRSTGFPAR(O);O:=244;
END ELSE IF(O>=239)AND(O<=242)THEN BEGIN P:=FIRSTGFPAR(O);
WHILE P>0 DO BEGIN Q:=GFBYTE;P:=P-1;END;O:=244;END;UNTIL O<>244;{:76};
IF(O=67)OR(O=68)THEN BEGIN M1SAVE:=M1;M2SAVE:=M2;MMSAVE:=M1*M2SIZE+M2;
IF O=67 THEN BEGIN{72:}TOTALGLYPHS:=TOTALGLYPHS+1;
CHARCODE:=GFSIGNEDQUAD;P:=GFSIGNEDQUAD;C:=CHARCODE MOD 256;
IF C<0 THEN C:=C+256;
IF C>127 THEN IF IMEXTENSION[CURFONT]=-1 THEN BEGIN IF NF2=NF THEN BEGIN
WRITELN(TTY,' ---Out of font storage space');GOTO 9998;END;
IMEXTENSION[CURFONT]:=NF2;NF2:=NF2-1;END;{WRITE(TTY,' boc[',C:1,']');
IF CHARCODE<>C THEN WRITE(TTY,' in family ',(CHARCODE-C)DIV 256:1);}
MINM:=GFSIGNEDQUAD;MAXM:=GFSIGNEDQUAD;MINN:=GFSIGNEDQUAD;
MAXN:=GFSIGNEDQUAD;
IF MAXM-MINM<=0 THEN EMPTYGLYPH:=TRUE ELSE EMPTYGLYPH:=FALSE;
STOWSIGNEDPA(MAXM-MINM+1);STOWSIGNEDPA(-MINM);STOWSIGNEDPA(MAXN-MINN+1);
STOWSIGNEDPA(MAXN);{:72}END ELSE BEGIN{74:}TOTALGLYPHS:=TOTALGLYPHS+1;
CHARCODE:=GFBYTE;P:=-1;C:=CHARCODE;
IF C>127 THEN IF IMEXTENSION[CURFONT]=-1 THEN BEGIN IF NF2=NF THEN BEGIN
WRITELN(TTY,' ---Out of font storage space');GOTO 9998;END;
IMEXTENSION[CURFONT]:=NF2;NF2:=NF2-1;END;{WRITELN(TTY);WRITELN(TTY);
WRITE(TTY,' boc1[',C:1,']');}DELM:=GFBYTE;MAXM:=GFBYTE;DELN:=GFBYTE;
MAXN:=GFBYTE;IF DELM<=0 THEN EMPTYGLYPH:=TRUE ELSE EMPTYGLYPH:=FALSE;
STOWSIGNEDPA(DELM+1);STOWSIGNEDPA(DELM-MAXM);STOWSIGNEDPA(DELN+1);
STOWSIGNEDPA(MAXN);
{WRITELN(TTY,' c=',C:1,' del_m+1=',DELM+1:1,' del_m-max_m=',DELM-MAXM:1,
' del_n+1=',DELN+1:1,' max_n=',MAXN:1);}{:74};END;
GLYPHPTR[DATABASE[CURFONT]+C]:=MMSAVE;
{WRITE(TTY,' (',CURFONT:1,')',C:1,'[',M1:1,',',M2:1,']');}
IF EMPTYGLYPH THEN BEGIN GLYPHPTR[DATABASE[CURFONT]+C]:=-1;
EMPTYGLYPH:=FALSE;END;{77:}MAXCOLUMNCOU:=0;COLUMNCOUNT:=0;ROWCOUNT:=0;
WHILE TRUE DO BEGIN 40:O:=GFBYTE;
CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63:BEGIN COLUMNCOUNT:=
COLUMNCOUNT+O-0;END;64:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
COLUMNCOUNT:=COLUMNCOUNT+O;END;65:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
COLUMNCOUNT:=COLUMNCOUNT+256*O;O:=GFBYTE;COLUMNCOUNT:=COLUMNCOUNT+O;END;
70:BEGIN ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=0;END;71:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
ROWCOUNT:=ROWCOUNT+1+O;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=0;END;
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,
116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238:BEGIN
ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=O-74;END;239:BEGIN O:=GFBYTE;WHILE O>0 DO BEGIN Q:=GFBYTE;
O:=O-1;END;GOTO 40;END;243:BEGIN O:=5;WHILE O>0 DO BEGIN Q:=GFBYTE;
O:=O-1;END;GOTO 40;END;244:GOTO 40;69:GOTO 30;
OTHERS:WRITELN(TTY,'! Unexpected command: ',O:1)END;
BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;END;
30:BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
IF COLUMNCOUNT>0 THEN ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
MMSTORE[M1SAVE,M2SAVE]:=MAXCOLUMNCOU DIV 256;
IF M2SAVE<M2MAX THEN M2SAVE:=M2SAVE+1 ELSE BEGIN M2SAVE:=4;
IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=MAXCOLUMNCOU MOD 256;
IF M2SAVE+3<M2MAX THEN M2SAVE:=M2SAVE+3 ELSE BEGIN M2SAVE:=M2SAVE+7-
M2MAX;IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=ROWCOUNT DIV 256;
IF M2SAVE<M2MAX THEN M2SAVE:=M2SAVE+1 ELSE BEGIN M2SAVE:=4;
IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=ROWCOUNT MOD 256;{:77};END;UNTIL O=248;{:70};
{TABULATE;WRITELN(TTY,' glyph-raster done');}WIDTHPTR:=WP;INGF:=TRUE;
GOTO 9999;9997:WRITELN(TTY,'---not loaded, GF file is bad');
9998:INGF:=FALSE;9999:END;{:59}{65:}FUNCTION INTFM(Z:INTEGER):BOOLEAN;
LABEL 9997,9998,9999;VAR K:INTEGER;LH:INTEGER;NW:INTEGER;
WP:0..MAXGLYPHS;ALPHA,BETA:INTEGER;BEGIN{66:}READTFMWORD;LH:=B2*256+B3;
READTFMWORD;FONTBC[CURFONT]:=B0*256+B1;FONTEC[CURFONT]:=B2*256+B3;
IF FONTEC[CURFONT]<FONTBC[CURFONT]THEN FONTBC[CURFONT]:=FONTEC[CURFONT]
+1;IF WIDTHPTR+FONTEC[CURFONT]-FONTBC[CURFONT]+1>MAXGLYPHS THEN BEGIN
WRITELN(TTY,'---not loaded, DVItype needs larger width table');
GOTO 9998;END;WP:=WIDTHPTR+FONTEC[CURFONT]-FONTBC[CURFONT]+1;
READTFMWORD;NW:=B0*256+B1;IF(NW=0)OR(NW>256)THEN GOTO 9997;
FOR K:=1 TO 3+LH DO BEGIN IF EOF(TFMFILE)THEN GOTO 9997;READTFMWORD;
IF K=4 THEN IF B0<128 THEN TFMCHECKSUM:=((B0*256+B1)*256+B2)*256+B3 ELSE
TFMCHECKSUM:=(((B0-256)*256+B1)*256+B2)*256+B3;END;{:66};{67:}
IF WP>0 THEN FOR K:=WIDTHPTR TO WP-1 DO BEGIN READTFMWORD;
IF B0>NW THEN GOTO 9997;WIDTH[K]:=B0;END;{:67};{68:}{64:}
BEGIN ALPHA:=16*Z;BETA:=16;WHILE Z>=8388608 DO BEGIN Z:=Z DIV 2;
BETA:=BETA DIV 2;END;END{:64};FOR K:=0 TO NW-1 DO BEGIN READTFMWORD;
INWIDTH[K]:=(((((B3*Z)DIV 256)+(B2*Z))DIV 256)+(B1*Z))DIV BETA;
IF B0>0 THEN IF B0<255 THEN GOTO 9997 ELSE INWIDTH[K]:=INWIDTH[K]-ALPHA;
END{:68};{69:}IF INWIDTH[0]<>0 THEN GOTO 9997;
DATABASE[CURFONT]:=WIDTHPTR-FONTBC[CURFONT];
IF WP>0 THEN FOR K:=WIDTHPTR TO WP-1 DO IF WIDTH[K]=0 THEN BEGIN WIDTH[K
]:=2147483647;PIXELWIDTH[K]:=0;
END ELSE BEGIN WIDTH[K]:=INWIDTH[WIDTH[K]];
PIXELWIDTH[K]:=ROUND(CONV*(WIDTH[K]));GLYPHPTR[K]:=-1;END{:69};
WIDTHPTR:=WP;INTFM:=TRUE;GOTO 9999;
9997:WRITELN(TTY,'---not loaded, TFM file is bad');9998:INTFM:=FALSE;
9999:END;{:65}{81:}FUNCTION STARTMATCH:BOOLEAN;VAR K:0..9;MATCH:BOOLEAN;
BEGIN MATCH:=TRUE;
FOR K:=0 TO STARTVALS DO IF STARTTHERE[K]AND(STARTCOUNT[K]<>COUNT[K])
THEN MATCH:=FALSE;STARTMATCH:=MATCH;END;{:81}{84:}PROCEDURE INPUTLN;
VAR K:0..TERMINALLINE;BEGIN BREAK(TTY);RESET(TTY);
IF EOLN(TTY)THEN READLN(TTY);K:=0;
WHILE(K<TERMINALLINE)AND NOT EOLN(TTY)DO BEGIN BUFFER[K]:=XORD[TTY↑];
K:=K+1;GET(TTY);END;BUFFER[K]:=32;END;{:84}{86:}
FUNCTION GETINTEGER:INTEGER;VAR X:INTEGER;NEGATIVE:BOOLEAN;
BEGIN IF BUFFER[BUFPTR]=45 THEN BEGIN NEGATIVE:=TRUE;BUFPTR:=BUFPTR+1;
END ELSE NEGATIVE:=FALSE;X:=0;
WHILE(BUFFER[BUFPTR]>=48)AND(BUFFER[BUFPTR]<=57)DO BEGIN X:=10*X+BUFFER[
BUFPTR]-48;BUFPTR:=BUFPTR+1;END;
IF NEGATIVE THEN GETINTEGER:=-X ELSE GETINTEGER:=X;END;{:86}{87:}
PROCEDURE DIALOG;LABEL 2,3,4,5;VAR K:INTEGER;BEGIN REWRITE(TTY);
WRITELN(TTY,'This is DVIIMP, Version 0.92');{88:}
2:WRITE(TTY,'Starting page (default=*): ');STARTVALS:=0;
STARTTHERE[0]:=FALSE;INPUTLN;BUFPTR:=0;K:=0;
IF BUFFER[0]<>32 THEN REPEAT IF BUFFER[BUFPTR]=42 THEN BEGIN STARTTHERE[
K]:=FALSE;BUFPTR:=BUFPTR+1;END ELSE BEGIN STARTTHERE[K]:=TRUE;
STARTCOUNT[K]:=GETINTEGER;END;
IF(K<9)AND(BUFFER[BUFPTR]=46)THEN BEGIN K:=K+1;BUFPTR:=BUFPTR+1;
END ELSE IF BUFFER[BUFPTR]=32 THEN STARTVALS:=K ELSE BEGIN WRITE(TTY,
'Type, e.g., 1.*.-5 to specify the ');
WRITELN(TTY,'first page with \count0=1, \count2=-5.');GOTO 2;END;
UNTIL STARTVALS=K{:88};{89:}
3:WRITE(TTY,'Maximum number of pages (default=1000000): ');
MAXPAGES:=1000000;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN BEGIN MAXPAGES:=GETINTEGER;
IF MAXPAGES<=0 THEN BEGIN WRITELN(TTY,'Please type a positive number.');
GOTO 3;END;END{:89};{90:}4:WRITE(TTY,'Assumed device resolution');
WRITE(TTY,' in pixels per inch (default=300/1): ');RESOLUTION:=300.0;
INPUTLN;BUFPTR:=0;IF BUFFER[0]<>32 THEN BEGIN K:=GETINTEGER;
IF(K>0)AND(BUFFER[BUFPTR]=47)AND(BUFFER[BUFPTR+1]>48)AND(BUFFER[BUFPTR+1
]<=57)THEN BEGIN BUFPTR:=BUFPTR+1;RESOLUTION:=K/GETINTEGER;
END ELSE BEGIN WRITE(TTY,'Type a ratio of positive integers;');
WRITELN(TTY,' (1 pixel per mm would be 254/10).');GOTO 4;END;END{:90};
{91:}5:WRITE(TTY,'New magnification (default=0 to keep the old one): ');
NEWMAG:=0;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=57)THEN NEWMAG:=
GETINTEGER ELSE BEGIN WRITE(TTY,'Type a positive integer to override ');
WRITELN(TTY,'the magnification in the DVI file.');GOTO 5;END{:91};{92:}
WRITELN(TTY,'Options selected:');WRITE(TTY,' Starting page = ');
FOR K:=0 TO STARTVALS DO BEGIN IF STARTTHERE[K]THEN WRITE(TTY,STARTCOUNT
[K]:1)ELSE WRITE(TTY,'*');
IF K<STARTVALS THEN WRITE(TTY,'.')ELSE WRITELN(TTY,' ');END;
WRITELN(TTY,' Maximum number of pages = ',MAXPAGES:1);
WRITELN(TTY,' Resolution = ',RESOLUTION:12:8,' pixels per inch');
IF NEWMAG>0 THEN WRITELN(TTY,' New magnification factor = ',NEWMAG/1000
:8:3){:92};END;{:87}{95:}FUNCTION RECONCILESCA(M:INTEGER):INTEGER;
LABEL 30;VAR I:0..12;BEGIN RECONCILESCA:=M;
FOR I:=0 TO 12 DO IF ABS(M-SCALEVAL[I])<ABS(M-SCALEVAL[I+1])THEN BEGIN
IF ABS(M-SCALEVAL[I])<4 THEN RECONCILESCA:=SCALEVAL[I];GOTO 30;END;
30:END;{:95}{96:}PROCEDURE IDENTIFYFONT(E:INTEGER);VAR F:0..MAXFONTS;
P:INTEGER;N:INTEGER;C,Q,D:INTEGER;K:0..NAMESIZE;M:INTEGER;
BEGIN IF NF=MAXFONTS THEN BEGIN WRITE(TTY,' ',
'DVIIMP capacity exceeded (max fonts=',MAXFONTS:1,')!');JUMPOUT;END;
FONTNUM[NF]:=E;F:=0;WHILE FONTNUM[F]<>E DO F:=F+1;{97:}C:=SIGNEDQUAD;
FONTCHECKSUM[NF]:=C;Q:=SIGNEDQUAD;FONTSCALEDSI[NF]:=Q;D:=SIGNEDQUAD;
FONTDESIGNSI[NF]:=D;P:=GETBYTE;FONTAVAL[NF]:=P;N:=GETBYTE;
FONTLVAL[NF]:=N;IF FONTNAME[NF]+N+P>NAMESIZE THEN BEGIN WRITE(TTY,' ',
'DVIIMP capacity exceeded (name size=',NAMESIZE:1,')!');JUMPOUT;END;
FONTNAME[NF+1]:=FONTNAME[NF]+N+P;
IF N+P=0 THEN BEGIN WRITE(TTY,' ',' null n+p ');JUMPOUT;
END ELSE FOR K:=FONTNAME[NF]TO FONTNAME[NF+1]-1 DO NAMES[K]:=GETBYTE;
M:=ROUND((0.3*MAG*Q)/D);
IF(M>=ROUND(1.05*RESOLUTION))AND(M<1500)THEN M:=RECONCILESCA(M);
FONTMVAL[NF]:=M;{NF:=NF+1;PRINTFONT(NF-1);WRITE(TTY,'.',M:1,' ');
WRITELN(TTY,' e=',E:1,' f=',NF:1,' c=',C:1,' q=',Q:1,' d=',D:1,' p=',P:1
,' n=',N:1);NF:=NF-1;}{:97};{98:}
IF(Q<=0)OR(Q>=134217728)THEN WRITE(TTY,'---may not load, bad scale (',Q:
1,')!')ELSE IF(D<=0)OR(D>=134217728)THEN WRITE(TTY,
'---may not load, bad design size (',D:1,')!');{:98};FONTSTATE[NF]:=0;
FONTSPACE[NF]:=Q DIV 6;NF:=NF+1;FONTSPACE[NF]:=0;END;{:96}{99:}
PROCEDURE SKIPIT;VAR I,J,K:INTEGER;BEGIN FOR I:=1 TO 13 DO J:=GETBYTE;
J:=J+GETBYTE;IF J>0 THEN FOR I:=1 TO J DO K:=GETBYTE;END;{:99}{100:}
PROCEDURE GETGFFILE;VAR P:INTEGER;N:INTEGER;R:0..NAMELENGTH;
K:0..NAMESIZE;M:INTEGER;BEGIN M:=FONTMVAL[CURFONT];P:=FONTAVAL[CURFONT];
N:=FONTLVAL[CURFONT];{103:}FOR K:=1 TO NAMELENGTH DO CURNAME[K]:=' ';
R:=0;
FOR K:=FONTNAME[CURFONT]+P TO FONTNAME[CURFONT+1]-1 DO IF(K<=FONTNAME[
CURFONT]+P+2)OR(K>=FONTNAME[CURFONT+1]-3)THEN BEGIN R:=R+1;
IF R+4>NAMELENGTH THEN BEGIN WRITE(TTY,' ',
'DVItype capacity exceeded (max font name length=',NAMELENGTH:1,')!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END;M:=FONTMVAL[CURFONT];CURNAME[R+1]:='.';
IF M<3600 THEN BEGIN IF M<1000 THEN CURNAME[R+2]:=XCHR[M DIV 100+48]ELSE
CURNAME[R+2]:=XCHR[M DIV 100+55];
CURNAME[R+3]:=XCHR[(M MOD 100)DIV 10+48];
CURNAME[R+4]:=XCHR[M MOD 10+48];R:=R+4;END ELSE BEGIN CURNAME[R+2]:='G';
CURNAME[R+3]:='F';R:=R+3;END;IF P=0 THEN FOR K:=1 TO 8 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;CURNAME[R]:=DEFAULTDIREC[K];
END ELSE FOR K:=FONTNAME[CURFONT]TO FONTNAME[CURFONT]+P-1 DO BEGIN R:=R
+1;IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END{:103};{PRINTFONT(CURFONT);
WRITE(TTY,'.',M:1);WRITE(TTY,'(',CURFONT:1,') ');}OPENGFFILE;
IF EOF(GFFILE)THEN BEGIN WRITELN(TTY);PRINTFONT(CURFONT);
PRINTEXTENSI(M);{WRITE(TTY,'(',CURFONT:1,') ');}WRITE(TTY,' not found');
{104:}FOR K:=1 TO NAMELENGTH DO CURTFMNAME[K]:=' ';R:=0;
FOR K:=FONTNAME[CURFONT]+P TO FONTNAME[CURFONT+1]-1 DO IF(K<=FONTNAME[
CURFONT]+P+2)OR(K>=FONTNAME[CURFONT+1]-3)THEN BEGIN R:=R+1;
IF R+4>NAMELENGTH THEN BEGIN WRITE(TTY,' ',
'DVItype capacity exceeded (max font name length=',NAMELENGTH:1,')!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURTFMNAME[R]:=XCHR[NAMES[K]-32]
ELSE CURTFMNAME[R]:=XCHR[NAMES[K]];END;CURTFMNAME[R+1]:='.';
CURTFMNAME[R+2]:='T';CURTFMNAME[R+3]:='F';CURTFMNAME[R+4]:='M';R:=R+4;
IF P=0 THEN FOR K:=1 TO 9 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;CURTFMNAME[R]:=DFLTTFMDIREC[K];
END ELSE FOR K:=FONTNAME[CURFONT]TO FONTNAME[CURFONT]+P-1 DO BEGIN R:=R
+1;IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURTFMNAME[R]:=XCHR[NAMES[K]-32]
ELSE CURTFMNAME[R]:=XCHR[NAMES[K]];END{:104};OPENTFMFILE;
IF EOF(TFMFILE)THEN BEGIN WRITE(TTY,' and there is no |tfm| file ');
FONTSTATE[CURFONT]:=-2;
END ELSE BEGIN WRITE(TTY,', characters will be left blank.');
FONTSTATE[CURFONT]:=2;END;END;END;{:100}{105:}PROCEDURE RELOADFONT;
LABEL 30,40;VAR K:INTEGER;C:INTEGER;O:INTEGER;P:INTEGER;A:INTEGER;
DELM:INTEGER;DELN:INTEGER;MMSAVE,M1SAVE,M2SAVE:INTEGER;BEGIN GETGFFILE;
{106:}O:=GFBYTE;O:=GFBYTE;O:=GFBYTE;WHILE O>0 DO BEGIN O:=O-1;P:=GFBYTE;
END;{:106};{107:}K:=0;WHILE FONTORDER[K]>=0 DO K:=K+1;
FONTORDER[K]:=CURFONT;REPEAT GFPREVPTR:=CURGFLOC;{76:}REPEAT O:=GFBYTE;
IF(O=243)THEN BEGIN P:=FIRSTGFPAR(O);O:=244;
END ELSE IF(O>=239)AND(O<=242)THEN BEGIN P:=FIRSTGFPAR(O);
WHILE P>0 DO BEGIN Q:=GFBYTE;P:=P-1;END;O:=244;END;UNTIL O<>244;{:76};
IF(O=67)OR(O=68)THEN BEGIN IF O=67 THEN{108:}
BEGIN CHARCODE:=GFSIGNEDQUAD;P:=GFSIGNEDQUAD;C:=CHARCODE MOD 256;
IF C<0 THEN C:=C+256;{WRITE(TTY,'[',C:1,']');
IF CHARCODE<>C THEN WRITE(TTY,' in family ',(CHARCODE-C)DIV 256:1);}
MINM:=GFSIGNEDQUAD;MAXM:=GFSIGNEDQUAD;MINN:=GFSIGNEDQUAD;
MAXN:=GFSIGNEDQUAD;DELM:=MAXM-MINM;DELN:=MAXN-MINN;END{:108}ELSE{109:}
BEGIN CHARCODE:=GFBYTE;P:=-1;C:=CHARCODE;DELM:=GFBYTE;MAXM:=GFBYTE;
DELN:=GFBYTE;MAXN:=GFBYTE;MINM:=MAXM-DELM;END{:109};
{WRITE(TTY,' c=',C:1);}IF GLYPHPTR[DATABASE[CURFONT]+C]<0 THEN{111:}
BEGIN O:=GFBYTE;WHILE O<>69 DO BEGIN A:=CURGFLOC;
WHILE(O<64)OR(O=70)OR((O>=74)AND(O<=238))DO O:=GFBYTE;
IF(O=64)OR(O=71)THEN BEGIN P:=GFBYTE;O:=GFBYTE;
END ELSE IF(O=65)OR(O=72)THEN BEGIN P:=GFBYTE;P:=GFBYTE;O:=GFBYTE;
END ELSE IF O=239 THEN BEGIN P:=GFBYTE;WHILE P>0 DO BEGIN Q:=GFBYTE;
P:=P-1;END;O:=GFBYTE;END;END;END{:111}ELSE BEGIN MMSAVE:=MM;M1SAVE:=M1;
M2SAVE:=M2;GLYPHPTR[DATABASE[CURFONT]+C]:=M1*M2SIZE+M2;
{WRITE(TTY,' (',CURFONT:1,')',C:1,'[',M1:1,',',M2:1,']');}{110:}
STOWSIGNEDPA(DELM+1);STOWSIGNEDPA(-MINM);STOWSIGNEDPA(DELN+1);
STOWSIGNEDPA(MAXN);{:110};{77:}MAXCOLUMNCOU:=0;COLUMNCOUNT:=0;
ROWCOUNT:=0;WHILE TRUE DO BEGIN 40:O:=GFBYTE;
CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63:BEGIN COLUMNCOUNT:=
COLUMNCOUNT+O-0;END;64:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
COLUMNCOUNT:=COLUMNCOUNT+O;END;65:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
COLUMNCOUNT:=COLUMNCOUNT+256*O;O:=GFBYTE;COLUMNCOUNT:=COLUMNCOUNT+O;END;
70:BEGIN ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=0;END;71:BEGIN BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;O:=GFBYTE;
ROWCOUNT:=ROWCOUNT+1+O;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=0;END;
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,
116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238:BEGIN
ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
COLUMNCOUNT:=O-74;END;239:BEGIN O:=GFBYTE;WHILE O>0 DO BEGIN Q:=GFBYTE;
O:=O-1;END;GOTO 40;END;243:BEGIN O:=5;WHILE O>0 DO BEGIN Q:=GFBYTE;
O:=O-1;END;GOTO 40;END;244:GOTO 40;69:GOTO 30;
OTHERS:WRITELN(TTY,'! Unexpected command: ',O:1)END;
BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;END;
30:BEGIN MMSTORE[M1,M2]:=O;
IF(MM<FREELIMIT)AND((MM+8)>FREELIMIT)THEN MAKESPACE;
IF M2<M2MAX THEN BEGIN M2:=M2+1;MM:=MM+1;END ELSE BEGIN M2:=4;MM:=MM+4;
IF M1<M1MAX THEN M1:=M1+1 ELSE BEGIN M1:=0;MM:=4;END;END;END;
IF COLUMNCOUNT>0 THEN ROWCOUNT:=ROWCOUNT+1;
IF COLUMNCOUNT>MAXCOLUMNCOU THEN MAXCOLUMNCOU:=COLUMNCOUNT;
MMSTORE[M1SAVE,M2SAVE]:=MAXCOLUMNCOU DIV 256;
IF M2SAVE<M2MAX THEN M2SAVE:=M2SAVE+1 ELSE BEGIN M2SAVE:=4;
IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=MAXCOLUMNCOU MOD 256;
IF M2SAVE+3<M2MAX THEN M2SAVE:=M2SAVE+3 ELSE BEGIN M2SAVE:=M2SAVE+7-
M2MAX;IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=ROWCOUNT DIV 256;
IF M2SAVE<M2MAX THEN M2SAVE:=M2SAVE+1 ELSE BEGIN M2SAVE:=4;
IF M1SAVE<M1MAX THEN M1SAVE:=M1SAVE+1 ELSE M1SAVE:=0;END;
MMSTORE[M1SAVE,M2SAVE]:=ROWCOUNT MOD 256;{:77};END;END;UNTIL O=248;
{:107};FONTSTATE[CURFONT]:=1;END;{:105}{114:}
FUNCTION READSIGNEDPA(MMTMP:INTEGER):INTEGER;VAR A,B:EIGHTBITS;
M1TMP,M2TMP:INTEGER;BEGIN M1TMP:=MMTMP DIV(M2SIZE);
M2TMP:=MMTMP MOD(M2SIZE);A:=MMSTORE[M1TMP,M2TMP];
IF M2TMP<M2MAX THEN M2TMP:=M2TMP+1 ELSE BEGIN M2TMP:=4;
IF M1TMP<M1MAX THEN M1TMP:=M1TMP+1 ELSE M1TMP:=0;END;
B:=MMSTORE[M1TMP,M2TMP];
IF A<128 THEN READSIGNEDPA:=(A*256)+B ELSE READSIGNEDPA:=(A-256)*256+B;
END;{:114}{115:}PROCEDURE SHOWIT(V:INTEGER);VAR I:INTEGER;
BEGIN FOR I:=1 TO 8 DO IF V>=ATAB[I]THEN BEGIN WRITE(TTY,'*');
V:=V-ATAB[I];END ELSE WRITE(TTY,'.');END;{:115}{116:}
PROCEDURE DOIMBGLY(C:INTEGER);VAR B,DIS,N,I,Q,VAL,W,REALW:INTEGER;
Q1,Q2:INTEGER;BYTESREQUIRE:INTEGER;BEGIN BEGIN WRITE(IMFILE,199);
IMBYTENO:=IMBYTENO+1;END;
IF C<128 THEN IMHALFWORD(CURFONT*128+C)ELSE IMHALFWORD(IMEXTENSION[
CURFONT]*128+C-128);Q:=PIXELWIDTH[DATABASE[CURFONT]+C];IMHALFWORD(Q);
Q:=GLYPHPTR[DATABASE[CURFONT]+C];Q1:=Q DIV(M2SIZE);Q2:=Q MOD(M2SIZE);
{WRITE(TTY,' im(',CURFONT:1,')',C:1,'[',Q1:1,',',Q2:1,']');}
BYTESREQUIRE:=((READSIGNEDPA(Q)+7)DIV 8);
FOR I:=1 TO 8 DO BEGIN BEGIN WRITE(IMFILE,MMSTORE[Q1,Q2]);
IMBYTENO:=IMBYTENO+1;END;
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;END;N:=0;DIS:=0;VAL:=0;
W:=0;REALW:=0;WHILE REALW<>69 DO BEGIN{117:}
WHILE N<BYTESREQUIRE DO BEGIN IF DIS=0 THEN BEGIN{120:}
BEGIN W:=MMSTORE[Q1,Q2];
IF W<=65 THEN BEGIN IF W=65 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1
ELSE BEGIN Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
W:=MMSTORE[Q1,Q2];BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;W:=W*256+MMSTORE[Q1,Q2];
END ELSE IF W=64 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN
Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;W:=MMSTORE[Q1,Q2];
END;BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=MMSTORE[Q1,Q2];
IF B<=65 THEN BEGIN IF B=65 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1
ELSE BEGIN Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
B:=MMSTORE[Q1,Q2];BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=B*256+MMSTORE[Q1,Q2];
END ELSE IF B=64 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN
Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=MMSTORE[Q1,Q2];
END;BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;END ELSE BEGIN B:=0;
W:=8*BYTESREQUIRE;END;END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;
END{:120};DIS:=W+B;END;WHILE DIS<8 DO BEGIN VAL:=VAL+BTAB[W]-BTAB[DIS];
{120:}BEGIN W:=MMSTORE[Q1,Q2];
IF W<=65 THEN BEGIN IF W=65 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1
ELSE BEGIN Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
W:=MMSTORE[Q1,Q2];BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;W:=W*256+MMSTORE[Q1,Q2];
END ELSE IF W=64 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN
Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;W:=MMSTORE[Q1,Q2];
END;BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=MMSTORE[Q1,Q2];
IF B<=65 THEN BEGIN IF B=65 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1
ELSE BEGIN Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
B:=MMSTORE[Q1,Q2];BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=B*256+MMSTORE[Q1,Q2];
END ELSE IF B=64 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN
Q2:=4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=MMSTORE[Q1,Q2];
END;BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;END ELSE BEGIN B:=0;
W:=8*BYTESREQUIRE;END;END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;
END{:120};W:=DIS+W;DIS:=W+B;END;
IF W>=8 THEN W:=W-8 ELSE BEGIN VAL:=VAL+BTAB[W];W:=0;END;
BEGIN WRITE(IMFILE,VAL);IMBYTENO:=IMBYTENO+1;END;DIS:=DIS-8;VAL:=0;
N:=N+1;END{:117};W:=MMSTORE[Q1,Q2];REALW:=W;
IF(W>=74)AND(W<=238)THEN{118:}BEGIN W:=W-74;
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=MMSTORE[Q1,Q2];
IF B<=65 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
IF B=65 THEN BEGIN B:=MMSTORE[Q1,Q2];
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;B:=B*256+MMSTORE[Q1,Q2];
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;
END ELSE IF B=64 THEN BEGIN B:=MMSTORE[Q1,Q2];
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;END;N:=0;DIS:=W+B;VAL:=0;
END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;N:=0;DIS:=W+B;VAL:=0;END{:118}
ELSE IF(W>=70)AND(W<74)THEN{119:}
BEGIN IF W>70 THEN BEGIN BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=
4;IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;W:=MMSTORE[Q1,Q2];
WHILE W>0 DO BEGIN FOR N:=1 TO BYTESREQUIRE DO BEGIN WRITE(IMFILE,0);
IMBYTENO:=IMBYTENO+1;END;W:=W-1;END;END;
BEGIN IF Q2<M2MAX THEN Q2:=Q2+1 ELSE BEGIN Q2:=4;
IF Q1<M1MAX THEN Q1:=Q1+1 ELSE Q1:=0;END;END;N:=0;DIS:=0;VAL:=0;W:=0;
B:=0;END{:119}
ELSE IF REALW<>69 THEN WRITELN(TTY,'BAD D L COM ',W:1,' (',CURFONT:1,')'
,C:1,'[',Q1:1,',',Q2:1,']');END;
GLYPHPTR[DATABASE[CURFONT]+C]:=-GLYPHPTR[DATABASE[CURFONT]+C];END;{:116}
{125:}FUNCTION FIRSTPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127:FIRSTPAR:=O
-0;128,133,235,239,243:FIRSTPAR:=GETBYTE;
129,134,236,240,244:FIRSTPAR:=GETTWOBYTES;
130,135,237,241,245:FIRSTPAR:=GETTHREEBYTE;
143,148,153,157,162,167:FIRSTPAR:=SIGNEDBYTE;
144,149,154,158,163,168:FIRSTPAR:=SIGNEDPAIR;
145,150,155,159,164,169:FIRSTPAR:=SIGNEDTRIO;
131,132,136,137,146,151,156,160,165,170,238,242,246:FIRSTPAR:=SIGNEDQUAD
;138,139,140,141,142,247,248,249,250,251,252,253,254,255:FIRSTPAR:=0;
147:FIRSTPAR:=W;152:FIRSTPAR:=X;161:FIRSTPAR:=Y;166:FIRSTPAR:=Z;
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:FIRSTPAR:=O-171;END;END;{:125}
{126:}FUNCTION RULEPIXELS(X:INTEGER):INTEGER;VAR N:INTEGER;
BEGIN N:=TRUNC(CONV*X);
IF N<CONV*X THEN RULEPIXELS:=N+1 ELSE RULEPIXELS:=N;END;{:126}{129:}
FUNCTION READASCII(P:INTEGER):REAL;VAR JJ,KK:REAL;NEGATIVE:BOOLEAN;
BEGIN JJ:=0.0;NEGATIVE:=FALSE;
WHILE(XXXO=32)AND(XXXK<P)DO BEGIN XXXK:=XXXK+1;XXXO:=GETBYTE;END;
IF(XXXO=45)AND(XXXK<P)THEN BEGIN NEGATIVE:=TRUE;XXXK:=XXXK+1;
XXXO:=GETBYTE;END;
WHILE(XXXO>=48)AND(XXXO<=57)AND(XXXK<=P)DO BEGIN JJ:=JJ*10+(XXXO-48);
XXXK:=XXXK+1;IF XXXK<=P THEN XXXO:=GETBYTE;END;
IF(XXXO=46)AND(XXXK<P)THEN BEGIN XXXK:=XXXK+1;XXXO:=GETBYTE;KK:=1.0;
WHILE(XXXO>=48)AND(XXXO<=57)AND(XXXK<=P)DO BEGIN KK:=KK*0.1;
JJ:=JJ+KK*(XXXO-48);XXXK:=XXXK+1;IF XXXK<=P THEN XXXO:=GETBYTE;END;END;
IF NEGATIVE THEN JJ:=-JJ;READASCII:=JJ;END;{:129}{130:}
PROCEDURE DOPOINT(P:INTEGER);VAR K:INTEGER;O:EIGHTBITS;MATCH:BOOLEAN;
BEGIN IF P<7 THEN FOR K:=2 TO P DO O:=GETBYTE ELSE BEGIN MATCH:=TRUE;
FOR K:=2 TO 6 DO BEGIN O:=GETBYTE;IF O<>XXXPOINT[K]THEN MATCH:=FALSE;
{WRITE(TTY,XCHR[O]);}END;PINDEX:=0;FOR K:=7 TO P DO BEGIN O:=GETBYTE;
IF MATCH THEN PINDEX:=PINDEX*10+O-48;END;
IF MATCH THEN BEGIN HHPOINT[PINDEX]:=ROUND(CONV*(H));
VVPOINT[PINDEX]:=ROUND(CONV*(V));
{WRITE(TTY,PINDEX:1,' ',ROUND(CONV*(H)):1,',',ROUND(CONV*(V)):1);}END;
END;END;{:130}{131:}PROCEDURE DOJOIN(P:INTEGER);VAR K,Q:INTEGER;JJ:REAL;
MATCH:BOOLEAN;
BEGIN IF P<8 THEN FOR K:=2 TO P DO XXXO:=GETBYTE ELSE BEGIN MATCH:=TRUE;
FOR K:=2 TO 5 DO BEGIN XXXO:=GETBYTE;
IF XXXO<>XXXJOIN[K]THEN MATCH:=FALSE;END;
IF NOT MATCH THEN FOR K:=6 TO P DO XXXO:=GETBYTE ELSE BEGIN XXXO:=
GETBYTE;XXXK:=6;JJ:=READASCII(P);PENSIZE:=ROUND(CONV*(JJ*65536.0));
IF PENSIZE>20 THEN PENSIZE:=20 ELSE IF PENSIZE<0 THEN PENSIZE:=0;
BEGIN WRITE(IMFILE,232);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,PENSIZE);IMBYTENO:=IMBYTENO+1;END;VERTEXCOUNT:=1;
Q:=0;XXXK:=XXXK+1;FOR K:=XXXK TO P DO BEGIN XXXO:=GETBYTE;
IF(XXXO>=48)AND(XXXO<=57)THEN Q:=Q*10+XXXO-48 ELSE IF XXXO=32 THEN BEGIN
JOINPOINTS[VERTEXCOUNT]:=Q;VERTEXCOUNT:=VERTEXCOUNT+1;Q:=0;END;END;
JOINPOINTS[VERTEXCOUNT]:=Q;BEGIN WRITE(IMFILE,230);IMBYTENO:=IMBYTENO+1;
END;IMHALFWORD(VERTEXCOUNT);
FOR Q:=1 TO VERTEXCOUNT DO BEGIN IMHALFWORD(HHPOINT[JOINPOINTS[Q]]);
IMHALFWORD(VVPOINT[JOINPOINTS[Q]]);END;BEGIN WRITE(IMFILE,234);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,15);IMBYTENO:=IMBYTENO+1;
END;END;END;END;{:131}{132:}PROCEDURE DOCIRCLE(P:INTEGER);
VAR K,Q,R:INTEGER;JJ:REAL;MATCH:BOOLEAN;
BEGIN IF P<13 THEN FOR K:=2 TO P DO XXXO:=GETBYTE ELSE BEGIN MATCH:=TRUE
;FOR K:=2 TO 7 DO BEGIN XXXO:=GETBYTE;
IF XXXO<>XXXCIRCLE[K]THEN MATCH:=FALSE;{WRITE(TTY,XCHR[XXXO]);}END;
IF NOT MATCH THEN FOR K:=8 TO P DO XXXO:=GETBYTE ELSE BEGIN XXXO:=
GETBYTE;XXXK:=8;JJ:=READASCII(P);PENSIZE:=ROUND(CONV*(JJ*65536.0));
IF PENSIZE>20 THEN PENSIZE:=20 ELSE IF PENSIZE<0 THEN PENSIZE:=0;
BEGIN WRITE(IMFILE,232);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,PENSIZE);IMBYTENO:=IMBYTENO+1;END;{147:}
IF HHI<>HH THEN BEGIN{WRITE(TTY,' ',HHI:1,',',HH:1);}HHI:=HH;
BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:147};
BEGIN WRITE(IMFILE,150);IMBYTENO:=IMBYTENO+1;END;
{WRITE(TTY,'(',PENSIZE:1,')');}JJ:=READASCII(P);
R:=ROUND(CONV*(JJ*65536.0));IMHALFWORD(R);{WRITE(TTY,'(',R:1,')');}
JJ:=READASCII(P);Q:=-ROUND(JJ*16384/360);IMHALFWORD(Q);
{WRITE(TTY,'(',Q:1,')');}JJ:=READASCII(P);R:=-ROUND(JJ*16384/360);
IMHALFWORD(R);{WRITE(TTY,'(',R:1,')');}BEGIN WRITE(IMFILE,234);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,15);IMBYTENO:=IMBYTENO+1;
END;END;END;END;{:132}{133:}PROCEDURE DOELLIPSE(P:INTEGER);
VAR K,Q,R:INTEGER;JJ:REAL;MATCH:BOOLEAN;
BEGIN IF P<18 THEN FOR K:=2 TO P DO XXXO:=GETBYTE ELSE BEGIN MATCH:=TRUE
;FOR K:=2 TO 8 DO BEGIN XXXO:=GETBYTE;
IF XXXO<>XXXELLIPSE[K]THEN MATCH:=FALSE;{WRITE(TTY,XCHR[XXXO]);}END;
IF NOT MATCH THEN FOR K:=9 TO P DO XXXO:=GETBYTE ELSE BEGIN XXXO:=
GETBYTE;XXXK:=9;JJ:=READASCII(P);PENSIZE:=ROUND(CONV*(JJ*65536.0));
IF PENSIZE>20 THEN PENSIZE:=20 ELSE IF PENSIZE<0 THEN PENSIZE:=0;
BEGIN WRITE(IMFILE,232);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,PENSIZE);IMBYTENO:=IMBYTENO+1;END;{147:}
IF HHI<>HH THEN BEGIN{WRITE(TTY,' ',HHI:1,',',HH:1);}HHI:=HH;
BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:147};
BEGIN WRITE(IMFILE,151);IMBYTENO:=IMBYTENO+1;END;
{WRITE(TTY,'(',PENSIZE:1,')');}JJ:=READASCII(P);
R:=ROUND(CONV*(JJ*65536.0));IMHALFWORD(R);{WRITE(TTY,'(',R:1,')');}
JJ:=READASCII(P);R:=ROUND(CONV*(JJ*65536.0));IMHALFWORD(R);
{WRITE(TTY,'(',R:1,')');}JJ:=READASCII(P);Q:=-ROUND(JJ*16384/360);
IMHALFWORD(Q);{WRITE(TTY,'(',Q:1,')');}JJ:=READASCII(P);
Q:=-ROUND(JJ*16384/360);IMHALFWORD(Q);{WRITE(TTY,'(',Q:1,')');}
JJ:=READASCII(P);R:=-ROUND(JJ*16384/360);IMHALFWORD(R);
{WRITE(TTY,'(',R:1,')');}BEGIN WRITE(IMFILE,234);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,15);IMBYTENO:=IMBYTENO+1;END;END;END;END;{:133}
{136:}{141:}PROCEDURE SPECIALCASES(O:EIGHTBITS;P,A:INTEGER);
LABEL 45,44,30;VAR Q:INTEGER;K:INTEGER;VVV:INTEGER;BEGIN CASE O OF{144:}
157,158,159,160:BEGIN IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV
*(V+P))ELSE VV:=VV+ROUND(CONV*(P));GOTO 44;END;
161,162,163,164,165:BEGIN Y:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));GOTO 44;END;166,167,168,169,170:BEGIN Z:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));GOTO 44;END;{:144}{145:}
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:GOTO 45;235,236,237,238:GOTO 45;
243,244,245,246:BEGIN SKIPIT;GOTO 30;END;{:145}239,240,241,242:{146:}
BEGIN IF P<0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'string of negative length!','!');JUMPOUT;END;IF P<=0 THEN GOTO 30;
O:=GETBYTE;CASE O OF 112:BEGIN{WRITELN(TTY);WRITE(TTY,A:1,': ');
WRITE(TTY,' p');}DOPOINT(P);END;106:BEGIN{WRITELN(TTY);
WRITE(TTY,A:1,': ');WRITE(TTY,' j');}DOJOIN(P);END;
99:BEGIN{WRITELN(TTY);WRITE(TTY,A:1,': ');WRITE(TTY,' c');}DOCIRCLE(P);
END;101:BEGIN{WRITELN(TTY);WRITE(TTY,A:1,': ');WRITE(TTY,' e');}
DOELLIPSE(P);END;OTHERS:BEGIN WRITE(TTY,' othercases');
FOR K:=2 TO P DO O:=GETBYTE;END END;GOTO 30;END{:146};
247:BEGIN WRITE(TTY,' ','Bad DVI file: ',
'preamble command within a page!','!');JUMPOUT;END;
248,249:BEGIN WRITE(TTY,' ','Bad DVI file: ',
'postamble command within a page!','!');JUMPOUT;END;
OTHERS:BEGIN WRITE(TTY,' ','Bad DVI file: ','undefined command ',O:1,'!'
,'!');JUMPOUT;END END;44:{151:}
IF(V>0)AND(P>0)THEN IF V>2147483647-P THEN BEGIN WRITE(TTY,
'arithmetic overflow! parameter changed from ',P:1,' to ',2147483647-V:1
);P:=2147483647-V;END;
IF(V<0)AND(P<0)THEN IF-V>P+2147483647 THEN BEGIN WRITE(TTY,
'arithmetic overflow! parameter changed from ',P:1,' to ',(-V)
-2147483647:1);P:=(-V)-2147483647;END;VVV:=ROUND(CONV*(V+P));
IF ABS(VVV-VV)>2 THEN BEGIN IF VVV>VV THEN VV:=VVV-2 ELSE VV:=VVV+2;
VVI:=VV;BEGIN WRITE(IMFILE,137);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(VVI);END;V:=V+P;{WRITE(TTY,' d ',VV:1,' ');}GOTO 30{:151};
45:{152:}FONTNUM[NF]:=P;CURFONT:=0;
WHILE FONTNUM[CURFONT]<>P DO CURFONT:=CURFONT+1;
IF CURFONT=NF THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','bad font?','!')
;JUMPOUT;END;IF FONTSTATE[CURFONT]=0 THEN BEGIN GETGFFILE;
IF FONTSTATE[CURFONT]=0 THEN BEGIN IF INGF(FONTSCALEDSI[CURFONT])THEN
FONTSTATE[CURFONT]:=1 ELSE FONTSTATE[CURFONT]:=-1;END;
IF FONTSTATE[CURFONT]=2 THEN BEGIN IF INTFM(FONTSCALEDSI[CURFONT])THEN
FONTSTATE[CURFONT]:=2 ELSE FONTSTATE[CURFONT]:=-1;END;END;
BEGIN WRITE(IMFILE,207);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,CURFONT);IMBYTENO:=IMBYTENO+1;END;GOTO 30{:152};
30:END;{:141}PROCEDURE DOPAGE;LABEL 41,42,43,30,9999;VAR O:EIGHTBITS;
P,Q:INTEGER;G:INTEGER;A:INTEGER;HHH:INTEGER;BEGIN CURFONT:=NF;S:=0;W:=0;
X:=0;Y:=0;Z:=0;H:=ROUND(HORG/CONV);V:=ROUND(VORG/CONV);
HH:=ROUND(CONV*(H));VV:=ROUND(CONV*(V));HHI:=2147483647;VVI:=2147483647;
WHILE TRUE DO{139:}BEGIN A:=CURLOC;{WRITELN(TTY);WRITE(TTY,A:1,': ');}
O:=GETBYTE;P:=FIRSTPAR(O);
IF EOF(DVIFILE)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'the file ended prematurely','!');JUMPOUT;END;{140:}
IF O<128 THEN GOTO 41 ELSE CASE O OF 128,129,130,131:GOTO 41;
133,134,135,136:GOTO 41;132:GOTO 42;137:GOTO 42;{142:}138:GOTO 30;
139:BEGIN WRITE(TTY,' ','Bad DVI file: ','bop occurred before eop!','!')
;JUMPOUT;END;
140:BEGIN IF S<>0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'stack not empty at end of page (level ',S:1,')!','!');JUMPOUT;END;
GOTO 9999;END;141:BEGIN IF S=MAXSSOFAR THEN BEGIN MAXSSOFAR:=S+1;
IF S=MAXS THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'deeper than claimed in postamble!','!');JUMPOUT;END;
IF S=STACKSIZE THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'DVIIMP capacity exceeded (stack size=',STACKSIZE:1,')','!');JUMPOUT;
END;END;HSTACK[S]:=H;VSTACK[S]:=V;WSTACK[S]:=W;XSTACK[S]:=X;
YSTACK[S]:=Y;ZSTACK[S]:=Z;HHSTACK[S]:=HH;VVSTACK[S]:=VV;S:=S+1;
{WRITE(TTY,' push(',S:1,')',HH:1,',',VV:1);}GOTO 30;END;
142:BEGIN IF S=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'POP illegal at level zero','!');JUMPOUT;END ELSE BEGIN S:=S-1;
HH:=HHSTACK[S];VV:=VVSTACK[S];H:=HSTACK[S];V:=VSTACK[S];W:=WSTACK[S];
X:=XSTACK[S];Y:=YSTACK[S];Z:=ZSTACK[S];
{WRITE(TTY,' pop(',S:1,')',HH:1,',',VV:1);}END;GOTO 30;END;{:142}{143:}
143,144,145,146:BEGIN IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[
CURFONT])THEN HH:=ROUND(CONV*(H+P))ELSE HH:=HH+ROUND(CONV*(P));Q:=P;
GOTO 43;END;147,148,149,150,151:BEGIN W:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN HH:=ROUND(CONV
*(H+P))ELSE HH:=HH+ROUND(CONV*(P));Q:=P;GOTO 43;END;
152,153,154,155,156:BEGIN X:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN HH:=ROUND(CONV
*(H+P))ELSE HH:=HH+ROUND(CONV*(P));Q:=P;GOTO 43;END;{:143}
OTHERS:BEGIN SPECIALCASES(O,P,A);GOTO 30;END END{:140};41:{148:}
IF P<0 THEN P:=255-((-1-P)MOD 256)ELSE IF P>=256 THEN P:=P MOD 256;
Q:=WIDTH[DATABASE[CURFONT]+P];{WRITELN(TTY,' p=',P:1);
WRITELN(TTY,' bc=',FONTBC[CURFONT]:1,' ec=',FONTEC[CURFONT]:1);
WRITE(TTY,' ch',WIDTH[DATABASE[CURFONT]+P]:1);WRITELN(TTY,' q=',Q:1);}
IF Q=2147483647 THEN BEGIN WRITE(TTY,'character ',P:1,
' invalid in font ');PRINTFONT(CURFONT);
IF CURFONT<>NF THEN WRITE(TTY,'!');
END ELSE BEGIN G:=GLYPHPTR[DATABASE[CURFONT]+P];
{IF G<-3 THEN WRITE(TTY,' (',CURFONT:1,')',P:1);}
IF G=0 THEN BEGIN{WRITELN(TTY,' must reload (',CURFONT:1,')',P:1);}
RELOADFONT;G:=GLYPHPTR[DATABASE[CURFONT]+P];END;
{IF G=-1 THEN WRITE(TTY,' -1(',CURFONT:1,')',P:1);}
IF G>3 THEN DOIMBGLY(P);{147:}
IF HHI<>HH THEN BEGIN{WRITE(TTY,' ',HHI:1,',',HH:1);}HHI:=HH;
BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:147};
IF(FONTSTATE[CURFONT]=2)OR(G=-1)THEN BEGIN HHI:=HHI+PIXELWIDTH[DATABASE[
CURFONT]+P];{147:}IF HHI<>HH THEN BEGIN{WRITE(TTY,' ',HHI:1,',',HH:1);}
HHI:=HH;BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);
END;IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:147};
END ELSE BEGIN IF P<128 THEN BEGIN WRITE(IMFILE,P);IMBYTENO:=IMBYTENO+1;
END ELSE BEGIN BEGIN WRITE(IMFILE,207);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,IMEXTENSION[CURFONT]);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,P-128);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,207);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,CURFONT);IMBYTENO:=IMBYTENO+1;END;END;
HHI:=HHI+PIXELWIDTH[DATABASE[CURFONT]+P];END;END;IF O>=133 THEN GOTO 30;
IF Q=2147483647 THEN Q:=0 ELSE HH:=HH+PIXELWIDTH[DATABASE[CURFONT]+P];
GOTO 43{:148};42:{149:}Q:=SIGNEDQUAD;{147:}
IF HHI<>HH THEN BEGIN{WRITE(TTY,' ',HHI:1,',',HH:1);}HHI:=HH;
BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:147};
BEGIN WRITE(IMFILE,193);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(RULEPIXELS(Q));IMHALFWORD(RULEPIXELS(P));
IMHALFWORD(RULEPIXELS(-P));IF O=137 THEN GOTO 30;HH:=HH+RULEPIXELS(Q);
GOTO 43{:149};43:{150:}
IF(H>0)AND(Q>0)THEN IF H>2147483647-Q THEN BEGIN WRITE(TTY,
'arithmetic overflow! parameter changed from ',Q:1,' to ',2147483647-H:1
);Q:=2147483647-H;END;
IF(H<0)AND(Q<0)THEN IF-H>Q+2147483647 THEN BEGIN WRITE(TTY,
'arithmetic overflow! parameter changed from ',Q:1,' to ',(-H)
-2147483647:1);Q:=(-H)-2147483647;END;HHH:=ROUND(CONV*(H+Q));
IF ABS(HHH-HH)>2 THEN BEGIN IF HHH>HH THEN HH:=HHH-2 ELSE HH:=HHH+2;
HHI:=HH;BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(HHI);END;H:=H+Q;{WRITE(TTY,' r ',HH:1,' ');}GOTO 30{:150};
30:END{:139};9999:BEGIN WRITE(IMFILE,219);IMBYTENO:=IMBYTENO+1;END;END;
{:136}{137:}PROCEDURE BACKCOUNT;VAR K:0..255;
BEGIN MOVETOBYTE(NEWBACKPOINT);K:=GETBYTE;
IF K=139 THEN BEGIN FCOUNT:=FCOUNT+1;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF COUNT[0]=STARTPAGE THEN PAGEMATCH:=TRUE;NEWBACKPOINT:=SIGNEDQUAD;
END ELSE NEWBACKPOINT:=-1;END;{:137}{138:}PROCEDURE NEXTPAGE;
VAR K:0..255;BEGIN COUNTER:=COUNTER+1;MOVETOBYTE(NEWBACKPOINT);
K:=GETBYTE;IF K=139 THEN BEGIN FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
NEWBACKPOINT:=SIGNEDQUAD;
{WRITELN(TTY,' In next_page first_backpointer=',FIRSTBACKPOI:1);}END;
IF(COUNTER>=LCOUNT)THEN BEGIN DOPAGE;WRITE(TTY,'[',COUNT[0]:1,'] ');END;
END;{:138}{156:}PROCEDURE READPOSTAMBL;VAR K:INTEGER;P:INTEGER;
BEGIN POSTLOC:=CURLOC-5;
IF SIGNEDQUAD<>NUMERATOR THEN WRITELN(TTY,
'numerator doesn''t match the preamble!');
IF SIGNEDQUAD<>DENOMINATOR THEN WRITELN(TTY,
'denominator doesn''t match the preamble!');
IF SIGNEDQUAD<>MAG THEN IF NEWMAG=0 THEN WRITELN(TTY,
'magnification doesn''t match the preamble!');MAXV:=SIGNEDQUAD;
MAXH:=SIGNEDQUAD;MAXS:=GETTWOBYTES;TOTALPAGES:=GETTWOBYTES;{157:}
REPEAT K:=GETBYTE;IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);
IDENTIFYFONT(P);K:=138;END;UNTIL K<>138;
IF K<>249 THEN WRITELN(TTY,'byte ',CURLOC-1:1,' is not postpost!'){:157}
;END;{:156}{159:}BEGIN INITIALIZE;{161:}OPENDVIFILE;P:=GETBYTE;
IF P<>247 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'First byte isn''t start of preamble!','!');JUMPOUT;END;P:=GETBYTE;
IF P<>2 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'identification in byte 1 should be ',2:1,'!','!');JUMPOUT;END;{162:}
NUMERATOR:=SIGNEDQUAD;DENOMINATOR:=SIGNEDQUAD;
IF NUMERATOR<=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'numerator is ',NUMERATOR:1,'!');JUMPOUT;END;
IF DENOMINATOR<=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'denominator is ',DENOMINATOR:1,'!');JUMPOUT;END;
CONV:=(NUMERATOR/254000.0)*(RESOLUTION/DENOMINATOR);MAG:=SIGNEDQUAD;
IF NEWMAG>0 THEN MAG:=NEWMAG ELSE IF MAG<=0 THEN BEGIN WRITE(TTY,' ',
'Bad DVI file: ','magnification is ',MAG:1,'!');JUMPOUT;END;
TRUECONV:=CONV;CONV:=TRUECONV*(MAG/1000.0);{:162};IDLEN:=GETBYTE;P:=0;
WHILE P<IDLEN DO BEGIN P:=P+1;ID[P]:=GETBYTE;END;{:161};OPENIMFILE;
BEGIN WRITE(IMFILE,64);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,100);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,99);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,117);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,116);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,40);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,112);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,97);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,103);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,118);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,115);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,97);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,108);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,102);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,102);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,112);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,97);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,103);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,99);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,108);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,108);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,97);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,116);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,105);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,102);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,102);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,108);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,97);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,110);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,103);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,117);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,97);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,103);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,105);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,80);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,115);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,115);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,79);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,119);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;CALLI(20,0,0,PPN.INT,SUCCESS);
FOR DVINLEN:=1 TO 6 DO BEGIN WRITE(IMFILE,PPN.SIXBIT[DVINLEN]+32);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,44);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,78);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,97);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);
IMBYTENO:=IMBYTENO+1;END;CURNAM(DVIFILE,DVINAME);DVINLEN:=1;
WHILE ORD(DVINAME[DVINLEN])<>0 DO BEGIN BEGIN WRITE(IMFILE,XORD[DVINAME[
DVINLEN]]);IMBYTENO:=IMBYTENO+1;END;DVINLEN:=DVINLEN+1;END;
BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,68);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,86);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,73);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,45);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,105);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,100);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);
IMBYTENO:=IMBYTENO+1;END;FOR P:=0 TO IDLEN DO BEGIN WRITE(IMFILE,ID[P]);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,41);IMBYTENO:=IMBYTENO+1;END;{153:}N:=DVILENGTH;
IF N<53 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','only ',N:1,
' bytes long','!');JUMPOUT;END;M:=N-4;
REPEAT IF M=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','all 223s','!');
JUMPOUT;END;MOVETOBYTE(M);K:=GETBYTE;M:=M-1;UNTIL K<>223;
IF K<>2 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','ID byte is ',K:1,'!')
;JUMPOUT;END;MOVETOBYTE(M-3);Q:=SIGNEDQUAD;
IF(Q<0)OR(Q>M-33)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'post pointer ',Q:1,' at byte ',M-3:1,'!');JUMPOUT;END;MOVETOBYTE(Q);
K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;POSTLOC:=Q;FIRSTBACKPOI:=SIGNEDQUAD;
{:153};READPOSTAMBL;{158:}
IF FFLAG=FALSE THEN FCOUNT:=TOTALPAGES ELSE BEGIN FCOUNT:=0;Q:=POSTLOC;
MOVETOBYTE(Q);P:=GETBYTE;PAGEMATCH:=FALSE;FCOUNT:=0;
FIRSTBACKPOI:=SIGNEDQUAD;NEWBACKPOINT:=FIRSTBACKPOI;
WHILE(NEWBACKPOINT<>-1)AND(PAGEMATCH=FALSE)DO BACKCOUNT;END;
IF NFLAG=FALSE THEN LCOUNT:=1 ELSE LCOUNT:=FCOUNT-NUMPAGES+1;{:158};
{155:}Q:=POSTLOC;MOVETOBYTE(Q);K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;FIRSTBACKPOI:=SIGNEDQUAD;
NEWBACKPOINT:=FIRSTBACKPOI;
WHILE(NEWBACKPOINT<>-1)AND(COUNTER<FCOUNT)DO NEXTPAGE;
WHILE IMBYTENO MOD 4<>3 DO BEGIN WRITE(IMFILE,254);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,255);IMBYTENO:=IMBYTENO+1;END;{:155};
9999:CLOSE(IMFILE);CLOSE(DVIFILE);IF SPOOLIT THEN ESP(DVIFILE,IMFILE);
END.{:159}